package EnumBoost;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;

/**
 * Created by huxin on 2017/2/20.
 * 针对Enum的增强
 * 使用方式：Model(1), Model1
 * 使用的是最大的Key值来设置默认构造，存入有序映射集中。
 * 不覆盖toString方法。
 * 通过getValue方法可以得到设置的值。
 * 通过toString方法可以得到枚举的定义名。
 */
public enum IntegerEnumBoost {
    ;

    private int Value;


    private static class MapValue {
        public static HashMap<Integer, IntegerEnumBoost> map = new LinkedHashMap<>();
    }

    public static IntegerEnumBoost getLegNO(int value) {

        IntegerEnumBoost iEnumBoost = MapValue.map.get(value);
        if (iEnumBoost == null) {
            try {
                throw new Exception("get LegNO Error! value: " + value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return iEnumBoost;
    }

    IntegerEnumBoost(int i) {
        IntegerEnumBoost iEnumBoost = MapValue.map.get(i);
        if (iEnumBoost != null) {
            try {
                throw new Exception("IntegerEnumBoost Exist Index: " + i + " legNo: " + iEnumBoost.toString()
                        + ". Error: This legNO: " + this.toString() + " Index: " + i);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        this.Value = i;
        MapValue.map.put(this.Value, this);
    }

    IntegerEnumBoost() {
        Set<Integer> integerSet = MapValue.map.keySet();
        int size = integerSet.size();
        if(size == 0)
            this.Value = 0;
        else {
            //使用的是最大的Key值来设置默认构造
            long value = (Long) integerSet.toArray()[size - 1];

            value = value + 1;
            if( value > Integer.MAX_VALUE )
            {
                try {
                    throw new Exception("IntegerEnumBoost default construct error: " + value + " legNo: " + this.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else {
                this.Value = (int) value;
            }
        }
        MapValue.map.put(this.Value, this);
    }

    public Integer getValue() {
        return Value;
    }

}
